﻿using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using System.Collections;
using System;
using System.Data;
using AMS.Profile;
using System.Windows.Forms; 
using Montana.Entidades;
 
public enum TipoArchivo{
    PDF,
    Excel,
    HTML,
    Word
};
 
public class Reporte
{ 
    const string Usuario = "sa";
    const string Contraseña = "codigo12";
 
    string mSelectionFormula;
    Hashtable mFormulas; 
    
    public string SelectionFormula {
        get{
            return mSelectionFormula;
        }
        set{
            mSelectionFormula = value;
        }
    }  
 
    public Hashtable Formulas {
        get{
            if( mFormulas == null ){
                mFormulas = new Hashtable();
            }
 
            return mFormulas;
        }
        set{
            mFormulas = value;
        }
    }  
 
    public void SeleccionRangoFechas(string Campo, DateTime FechaDesde, DateTime FechaHasta) 
    {
        if( this.SelectionFormula != "" ){
            this.SelectionFormula += " and ";
        }
 
//crystal no toma las fechas inclusive en el rango, _
        //entonces se resta y suma 1 dia para que la fechas sean inclusive
        FechaDesde = FechaDesde.Subtract(new System.TimeSpan(1, 0, 0, 0));
        FechaHasta = FechaHasta.Add(new System.TimeSpan(1, 0, 0, 0));
 
        //formatea las fechas a Mes / Dia / Año y setea la seleccion
        this.SelectionFormula += "{" + Campo + "} in #" + FechaDesde.Date.ToString("MM/dd/yyyy") + "# to #" + FechaHasta.Date.ToString("MM/dd/yyyy") + "#";
    }  
 
    public void SeleccionIgualValor(string Campo, object Valor, bool Convertir) 
    {
        if( Valor == null )
        {
            return;
        }

        //si se pasa un numero y convertir es true, castea el valor a single (single encierra, enteros y decimales)
        Double d;
        if( Convertir && Double.TryParse(Valor.ToString(), out d) ){
            Valor = Convert.ToSingle(Valor);
        }
 
        //si es string y esta vacio, no hace la igualacion
        if(Valor is string && Valor.ToString() == "")
            return;
 
        if( this.SelectionFormula != "" ){
            this.SelectionFormula += " and ";
        }
 
        if( Valor is int | Valor is byte | Valor is float | Valor is short ){
            this.SelectionFormula += "{" + Campo + "} = " + Valor;
        }
 
        if( Valor is string ){
            this.SelectionFormula += "{" + Campo + "} = '" + Valor + "'";
        }
    }

    public frmReporte MostrarReporte(DataSet ds, ReportClass reporte, string selectionFormula, ParameterFields parametros)
    {
        frmReporte f = new frmReporte();
        //Xml xml = new Xml("DatosConexion.xml");
        //string ruta = xml.GetValue("conexion", "rutaReportes").ToString();
        string ruta = System.Configuration.ConfigurationManager.AppSettings["RutaReportes"];
        f.CRV.SelectionFormula = selectionFormula;
        f.CRV.ReportSource = ruta + reporte.ResourceName;
        
        //setea los valores de las formulas
        if (Formulas != null)
        {
            foreach (FormulaFieldDefinition formula in reporte.DataDefinition.FormulaFields)
            {
                if (formula.Text == "\"\"")
                    formula.Text = "\"" + Formulas[formula.Name] + "\"";
            }
        }

        reporte.SetDataSource(ds);

        f.Show();

        return f;
    }

    private ReportClass SetearConexionReporte(ReportClass Reporte, DataSet ds)
    {
        Xml xml = new Xml("DatosConexion.xml");
        string ruta = xml.GetValue("conexion", "rutaBase").ToString();

        //TableLogOnInfo tableLogOnInfo = new TableLogOnInfo();

        //ConnectionInfo cnnInfo = new ConnectionInfo();
        //cnnInfo.ServerName = ruta + "montana.mdb";
        //cnnInfo.DatabaseName = ruta + "montana.mdb";
        //cnnInfo.UserID = "a";
        //cnnInfo.Password = "a";

        foreach (Table Table in Reporte.Database.Tables)
        {
            //tableLogOnInfo = Table.LogOnInfo;
            //tableLogOnInfo.ConnectionInfo = cnnInfo;
            //Table.ApplyLogOnInfo(tableLogOnInfo);
            Table.SetDataSource(ds);
        }

        return Reporte;
    }

    public void Exportar(ReportClass Reporte, string servidor, string baseDatos, string Ruta, string Archivo, TipoArchivo TipoArchivo) 
    {
        CrystalDecisions.Shared.DiskFileDestinationOptions Destino = new CrystalDecisions.Shared.DiskFileDestinationOptions();
 
        //prepara la ruta y el nombre del archivo
        Ruta = Ruta.Replace(@"\", @"\\");
 
        Destino.DiskFileName = Ruta + (Ruta.Substring(Ruta.Length - 2) == "\\" ? "": @"\\") + Archivo;
 
        //elige el tipo de archivo
        switch(TipoArchivo){
            case TipoArchivo.PDF:
                Reporte.ExportOptions.ExportFormatType = ExportFormatType.PortableDocFormat;
                       break;
            case TipoArchivo.Excel:
                Reporte.ExportOptions.ExportFormatType = ExportFormatType.Excel;
 
                ExcelFormatOptions Ex = new ExcelFormatOptions();
 
                Reporte.ExportOptions.FormatOptions = Ex;
 
                       break;
            case TipoArchivo.HTML:
                Reporte.ExportOptions.ExportFormatType = ExportFormatType.HTML40;
 
                HTMLFormatOptions HT = new HTMLFormatOptions();
 
                HT.HTMLFileName = Archivo;
                HT.HTMLBaseFolderName = Ruta;
 
                Reporte.ExportOptions.FormatOptions = HT;
 
                       break;
            case TipoArchivo.Word:
                Reporte.ExportOptions.ExportFormatType = ExportFormatType.WordForWindows;
        break; }
 
        //setea las propiedades
        Reporte.ExportOptions.DestinationOptions = Destino;
        Reporte.ExportOptions.ExportDestinationType = ExportDestinationType.DiskFile;
 
        SetearConexionReporte(Reporte, servidor, baseDatos, Usuario, Contraseña);
 
        Reporte.Export();
    }



    private ReportClass SetearConexionReporte(ReportClass Reporte, string Servidor, string Base, string Usuario, string Contraseña) 
    {
        //***
        //Recibe un reporte (dimensionado asi: Dim Reporte as New rptNombreReporte) y
        //le carga los datos de conexion
        //***
        Database Database;
        Tables Tables;
        TableLogOnInfo TableLogOnInfo;
        ConnectionInfo ConnectionInfo;

        ConnectionInfo = new ConnectionInfo();
        ConnectionInfo.ServerName = Servidor;
        ConnectionInfo.DatabaseName = Base;
        ConnectionInfo.UserID = Usuario;
        ConnectionInfo.Password = Contraseña;
                
        Database = Reporte.Database;
        Tables = Database.Tables;

        foreach(Table Table in Tables)
        {
            //TableLogOnInfo.ConnectionInfo.DatabaseName = @"C:\Sistemas\Montana Secciones\Fuentes\montana.mdb";
            //Table.Location = @"C:\Sistemas\Montana Secciones\Fuentes\montana.mdb";
            //TableLogOnInfo = Table.LogOnInfo;
            //TableLogOnInfo.ConnectionInfo = ConnectionInfo;
            //Table.ApplyLogOnInfo(TableLogOnInfo);
            //Table.Location = Table.Name;
        }

        return Reporte;
    }

    public ParameterField ArmarParametro(ReportClass reporte, string nombreParametro, object valor)
    {
        ParameterDiscreteValue value = new ParameterDiscreteValue();
        ParameterField pf = new ParameterField();

        value.Value = valor;
        
        pf.Name = nombreParametro;
        pf.CurrentValues.Add(value);
        pf.HasCurrentValue = true;

        return pf;
    }

    public void AgregarParametro(ReportClass reporte, string nombreParametro, object valor)
    {
        //ParameterDiscreteValue val = new ParameterDiscreteValue();
        //val.Value = valor;
        //ParameterField field = new ParameterField();
        //field.Name = nombreParametro;
        //field.CurrentValues.Add(val);
        //field.HasCurrentValue = true;

        ParameterFieldDefinitions pfds = reporte.DataDefinition.ParameterFields;
        ParameterFieldDefinition pfd = pfds[nombreParametro];
        ParameterValues pvs = pfd.CurrentValues;

        ParameterDiscreteValue pdv = new ParameterDiscreteValue();
        pdv.Value = valor;
        pvs.Add(pdv);
        
        pfd.ApplyCurrentValues(pvs);        
    }
}